#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
A股股票筛选系统 - 演示版本
使用模拟数据展示完整的筛选流程和输出格式
"""

import pandas as pd
import numpy as np
from datetime import datetime
from tabulate import tabulate


def generate_demo_data():
    """生成演示数据"""
    np.random.seed(42)
    
    # 模拟50支股票数据
    stocks = []
    industries = ['半导体', '软件开发', '医疗器械', '锂电池', '光伏', '新能源车', '人工智能', 
                  '生物医药', '云计算', '新材料', '白酒', '食品饮料', '精密仪器', '工业自动化']
    
    names = [
        '科技创新', '智能制造', '医药先锋', '能源动力', '光芯科技', 
        '新材智造', '生物科技', '云端网络', '精工器械', '自动控制',
        '芯片制造', '软件服务', '医疗设备', '电池材料', '太阳能源',
        '电动科技', 'AI算法', '药业研发', '数据中心', '高端材料',
        '白酒龙头', '饮料制造', '测量仪器', '机器人', '传感科技',
        '通信设备', '存储芯片', '诊断试剂', '储能技术', '风电装备',
        '显示面板', '操作系统', '康复器械', '正极材料', '逆变器',
        '充电桩', '语音识别', '抗体药物', '边缘计算', '碳纤维',
        '高端白酒', '乳制品', '光谱仪', '减速器', '压力传感',
        '基站设备', '模拟芯片', '影像诊断', '氢能源', '海上风电'
    ]
    
    for i in range(50):
        code = f"{600000 + i:06d}" if i < 25 else f"{300000 + i:06d}"
        stock = {
            '代码': code,
            '名称': names[i],
            '行业': np.random.choice(industries),
            '最新价': np.round(np.random.uniform(10, 45), 2),
            '市盈率': np.round(np.random.uniform(8, 28), 2),
            '市净率': np.round(np.random.uniform(1.5, 4.5), 2),
            '净资产收益率': np.round(np.random.uniform(12, 35), 2),
            '资产负债率': np.round(np.random.uniform(20, 55), 2),
            '营业收入同比增长': np.round(np.random.uniform(18, 45), 2),
            '3个月涨跌幅': np.round(np.random.uniform(-8, 18), 2),
            '52周回撤': np.round(np.random.uniform(5, 28), 2),
            '换手率': np.round(np.random.uniform(1, 8), 2),
            '成交额': np.round(np.random.uniform(0.8, 5), 2),
            '总市值': np.round(np.random.uniform(60, 500), 2),
        }
        stocks.append(stock)
    
    return pd.DataFrame(stocks)


def screen_stocks(df):
    """执行筛选"""
    print("【筛选流程】")
    print(f"初始股票池: {len(df)} 支\n")
    
    # 基本面筛选
    df = df[
        (df['市盈率'] >= 5) & (df['市盈率'] <= 30) &
        (df['市净率'] >= 0.8) & (df['市净率'] <= 5) &
        (df['净资产收益率'] >= 15) &
        (df['资产负债率'] <= 60) &
        (df['营业收入同比增长'] >= 20)
    ]
    print(f"基本面筛选后: {len(df)} 支")
    
    # 技术面筛选
    df = df[
        (df['3个月涨跌幅'] >= -10) & (df['3个月涨跌幅'] <= 20) &
        (df['52周回撤'] <= 30)
    ]
    print(f"技术面筛选后: {len(df)} 支\n")
    
    return df


def score_stocks(df):
    """综合评分"""
    # ROE得分（40分）
    df['ROE得分'] = (df['净资产收益率'] / df['净资产收益率'].max()) * 40
    
    # 增长得分（30分）
    df['增长得分'] = (df['营业收入同比增长'] / df['营业收入同比增长'].max()) * 30
    
    # 估值得分（30分）
    df['估值得分'] = (1 - (df['市盈率'] - 5) / 25) * 30
    
    # 综合得分
    df['综合得分'] = df['ROE得分'] + df['增长得分'] + df['估值得分']
    
    # 生成推荐理由
    def generate_reason(row):
        reasons = []
        reasons.append(row['行业'])
        
        if row['净资产收益率'] >= 25:
            reasons.append('ROE优秀')
        elif row['净资产收益率'] >= 20:
            reasons.append('ROE良好')
        
        if row['营业收入同比增长'] >= 35:
            reasons.append('高速增长')
        elif row['营业收入同比增长'] >= 25:
            reasons.append('稳健增长')
        
        if row['市盈率'] < 15:
            reasons.append('估值偏低')
        elif row['市盈率'] < 20:
            reasons.append('估值合理')
        
        if row['资产负债率'] < 35:
            reasons.append('低负债')
        
        return '，'.join(reasons)
    
    df['推荐理由'] = df.apply(generate_reason, axis=1)
    
    # 排序
    df = df.sort_values('综合得分', ascending=False)
    
    return df


def print_report(df):
    """打印报告"""
    print("="*100)
    print("A股股票智能筛选结果 - 演示版本".center(100))
    print("="*100 + "\n")
    
    # 准备显示数据
    display_df = df[[
        '代码', '名称', '行业', '最新价', '市盈率', '市净率',
        '净资产收益率', '资产负债率', '营业收入同比增长',
        '3个月涨跌幅', '52周回撤', '推荐理由'
    ]].head(20).copy()
    
    # 格式化
    display_df['最新价'] = display_df['最新价'].apply(lambda x: f"{x:.2f}")
    display_df['市盈率'] = display_df['市盈率'].apply(lambda x: f"{x:.2f}")
    display_df['市净率'] = display_df['市净率'].apply(lambda x: f"{x:.2f}")
    display_df['净资产收益率'] = display_df['净资产收益率'].apply(lambda x: f"{x:.1f}%")
    display_df['资产负债率'] = display_df['资产负债率'].apply(lambda x: f"{x:.1f}%")
    display_df['营业收入同比增长'] = display_df['营业收入同比增长'].apply(lambda x: f"{x:.1f}%")
    display_df['3个月涨跌幅'] = display_df['3个月涨跌幅'].apply(lambda x: f"{x:.1f}%")
    display_df['52周回撤'] = display_df['52周回撤'].apply(lambda x: f"{x:.1f}%")
    
    print(tabulate(display_df, headers='keys', tablefmt='grid', showindex=False))
    
    # 风险提示
    print(f"\n{'='*100}")
    print("⚠️  风险提示".center(100))
    print("="*100)
    print("  1. 本筛选结果仅供参考，不构成投资建议")
    print("  2. 股市有风险，投资需谨慎")
    print("  3. 历史业绩不代表未来表现")
    print("  4. 请结合自身研究与风险承受能力决策")
    print("="*100 + "\n")


def export_excel(df, filename='筛选结果_演示版.xlsx'):
    """导出Excel"""
    try:
        with pd.ExcelWriter(filename, engine='openpyxl') as writer:
            # 筛选结果
            output_df = df[[
                '代码', '名称', '行业', '最新价', '总市值', '市盈率', '市净率',
                '净资产收益率', '资产负债率', '营业收入同比增长',
                '3个月涨跌幅', '52周回撤', '综合得分', '推荐理由'
            ]].head(20)
            output_df.to_excel(writer, sheet_name='筛选结果', index=False)
            
            # 完整数据
            df.to_excel(writer, sheet_name='详细数据', index=False)
            
            # 参数说明
            params = pd.DataFrame({
                '参数名称': [
                    '股价区间', 'PE区间', 'PB区间', 'ROE', '资产负债率',
                    '营收增长', '3个月涨跌幅', '52周回撤'
                ],
                '标准值': [
                    '7-50元', '5-30', '0.8-5', '>15%', '<60%',
                    '>20%', '-10%~20%', '<30%'
                ]
            })
            params.to_excel(writer, sheet_name='筛选参数', index=False)
        
        print(f"✓ Excel已导出: {filename}\n")
    except Exception as e:
        print(f"✗ Excel导出失败: {e}\n")


def main():
    """主函数"""
    print("="*80)
    print("A股股票智能筛选系统 - 演示版".center(80))
    print("="*80)
    print(f"运行时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    print("说明: 本演示使用模拟数据展示完整筛选流程\n")
    
    # 生成数据
    print("【数据准备】")
    df = generate_demo_data()
    print(f"✓ 生成 {len(df)} 支模拟股票数据\n")
    
    # 筛选
    df = screen_stocks(df)
    
    if df.empty:
        print("✗ 无符合条件的股票")
        return
    
    # 评分
    print("【综合评分】")
    df = score_stocks(df)
    print(f"✓ 完成评分，Top 20 股票综合得分: {df['综合得分'].head(20).mean():.1f}\n")
    
    # 输出报告
    print_report(df)
    
    # 导出Excel
    export_excel(df)
    
    print("✓ 演示完成！\n")
    print("提示:")
    print("  - 这是演示版本，使用的是模拟数据")
    print("  - 实际使用请运行 stock_screener_eastmoney.py 获取真实市场数据")
    print("  - 如遇API连接问题，可能需要配置网络代理或稍后重试\n")


if __name__ == "__main__":
    main()
